package design_patterns

import "fmt"

// Component 接口，定义了一个展示消息的方法
type Component interface {
	showMessage()
}

// ConcreteComponent 具体组件，实现了 Component 接口
type ConcreteComponent struct{}

// showMessage 实现了 Component 接口的方法，输出基础消息
func (c *ConcreteComponent) showMessage() {
	fmt.Println("Hello, I am a Concrete Component.")
}

// Decorator 装饰器基类，持有一个 Component 接口对象
type Decorator struct {
	component Component
}

// showMessage 调用被装饰对象的 showMessage 方法
func (d *Decorator) showMessage() {
	d.component.showMessage()
}

// ConcreteDecoratorA 具体装饰器A，继承自 Decorator
type ConcreteDecoratorA struct {
	Decorator
}

// showMessage 增强了原有的 showMessage 方法，添加了额外功能A
func (d *ConcreteDecoratorA) showMessage() {
	d.Decorator.showMessage()
	fmt.Println("Additional functionality A.")
}

// ConcreteDecoratorB 具体装饰器B，继承自 Decorator
type ConcreteDecoratorB struct {
	Decorator
}

// showMessage 增强了原有的 showMessage 方法，添加了额外功能B
func (d *ConcreteDecoratorB) showMessage() {
	d.Decorator.showMessage()
	fmt.Println("Additional functionality B.")
}
